package cn.caishen.report.common.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

/**
 * @author LB
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Value("${swagger.enable}")
    private boolean enableSwagger;

    @Bean
    public static PropertySourcesPlaceholderConfigurer swaggerProperties() {
        PropertySourcesPlaceholderConfigurer propertiesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
        propertiesPlaceholderConfigurer.setIgnoreUnresolvablePlaceholders(true);
        return propertiesPlaceholderConfigurer;
    }

    @Bean
    public Docket createRestApi() {
        //添加head参数start
        ParameterBuilder tokenPar = new ParameterBuilder();
        List<Parameter> pars = new ArrayList<Parameter>();
        tokenPar.name("token").description("令牌").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
        pars.add(tokenPar.build());
        //添加head参数end
        return new Docket(DocumentationType.SWAGGER_2)
                .enable(enableSwagger)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("cn.caishen"))
                .paths(PathSelectors.any()).build().globalOperationParameters(pars).apiInfo(apiInfo());
    }

    /**
     * 该套 API 说明，包含作者、简介、版本、host、服务URL
     *
     * @return
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("动态报表 dynamic-report 接口说明")
                .contact(new Contact("LB", "null", "sli33t@163.com"))
                .version("1.0")
                .termsOfServiceUrl("localhost:8000/")
                .description("dynamic-report API")
                .build();
    }


    /**
     * @Api()用于类；
     * 标识这个类是swagger的资源
     * 　　tags–表示分组说明标签
     *
     * @ApiOperation()用于方法；
     * 表示一个http请求的操作
     * 　　value用于方法描述
     *
     * 　　notes用于提示内容
     *
     * @ApiModel()用于实体类
     * 表示对类进行说明，用于参数用实体类接收
     *
     *       value–表示对象名
     *       description–描述
     *
     *
     * @ApiModelProperty()用于实体类字段
     * 表示对model属性的说明或者数据操作更改
     * 　　value–字段说明
     * 　　name–重写属性名字
     * 　　dataType–重写属性类型
     * 　　required–是否必填
     * 　　example–举例说明
     * 　　hidden–隐藏
     *
     *
     * @ApiImplicitParam() 用于 controller 方法
     * 表示单独的请求参数
     * 　　name：参数名
     *     value：参数的汉字说明、解释
     *     required：参数是否必须传
     *     paramType：参数放在哪个地方
     *             · header --> 请求参数的获取：@RequestHeader
     *             · query --> 请求参数的获取：@RequestParam
     *             · path（用于restful接口）--> 请求参数的获取：@PathVariable
     *             · body（不常用）
     *             · form（不常用）
     *     dataType：参数类型，默认String，其它值dataType="Integer"
     *     defaultValue：参数的默认值
     *
     * @ApiImplicitParams() 用于 controller 方法，包含多个 @ApiImplicitParam
     *
     *
     * @ApiIgnore()用于类或者方法上，可以不被swagger显示在页面上
     *
     * 说明：简单的标记只需要@Api(tags="") 和 @ApiOperation(value="",notes="")
     *
     *
     */
}
